/**
 * 数组去重，最核心的遍历法
 * 两个属性相同的对象也成为去重
 * {a:1}与{a:1}
 */

/**
 * 返回一个不重复的数组
 * @param {Array} arrs 去重数组
 * @returns {Array} 不重复的数组
 */
function uniqueArray(arrs) {
  const result = [];
  for (let i = 0; i < arrs.length; i++) {
    let isFind = false; // 表示i在j中是否存在
    for (let j = i + 1; j < arrs.length; j++) {
      if (equal(arrs[i], arrs[j]) === true) {
        isFind = true;
        break;
      }
    }
    if (isFind === false) {
      result.push(arrs[i]);
    }
  }

  return result;
}

/**
 * 判断两个值是否相等
 * @param {any} value1 值1
 * @param {any} value2 值2
 * @returns {boolean} 真值
 */
function equal(value1, value2) {
  // 有一个为原始值，则就用严格相等比较或Object.is
  if (isPrimitive(value1) || isPrimitive(value2)) {
    return Object.is(value1, value2);
  }
  // 比较两个对象的键值对
  const keys1 = Object.keys(value1);
  const keys2 = Object.keys(value2);
  if (keys1.length !== keys2.length) {
    return false;
  }

  for (const key of keys1) {
    // 判断键存在和键存在且值一样
    if (!equal(value1[key], value2[key]) || !keys2.includes(key)) {
      return false;
    }
  }

  return true;
}

/**
 * 判断一个值是否是原始值
 * @param {any} value 值
 * @returns {boolean} 真值
 */
function isPrimitive(value) {
  return value !== null && !["object", "function"].includes(typeof value);
}

// 测试

// console.log(isPrimitive(function(){}));

// console.log(equal({ a: 1 }, { a: 1 }));
const arrs = [1, 2, 3, { a: 1, c: undefined }, { c: undefined, a: 1 }];
console.log(uniqueArray(arrs));
